package com.navinfo.platform.flink.cdc.util;

import com.alibaba.fastjson.JSONObject;

import java.sql.Timestamp;

public class FieldUtils {
    /**
     * 对于datetime类型字段,cdc得到的原始时间戳,和直接用UNIX_TIMESTAMP函数得到的结果不一致
     * 尝试通过时区参数来改变,但是并未生效
     * 无论怎么设置时区,得到的原始时间戳都不变,这里做一个修正
     */
    public static Timestamp getTimestamp(JSONObject fields, String fieldName) {
        if (!fields.containsKey(fieldName)) {
            return null;
        }
        String fieldValue = fields.getString(fieldName);
        if (fieldValue == null) {
            return null;
        }
        if (fieldValue.length() <= 13) { //1625659261000这样的
            return new Timestamp(Long.parseLong(fieldValue) - 3600 * 1000 * 8);
        } else if (fieldValue.length() == 20) { //2021-07-13T21:18:38Z这样的
            //用fastjson的方法,能直接得到正确的时间戳
            return new Timestamp(fields.getLong(fieldName));
        }
        return new Timestamp(0);
    }

    /**
     * long型的源字段(毫秒值),转成datetime型的目标字段
     */
    public static Timestamp milliSecondToTimestamp(JSONObject fields, String fieldName) {
        if (!fields.containsKey(fieldName)) {
            return null;
        }
        Long ts = fields.getLong(fieldName);
        return new Timestamp(ts);
    }

    /**
     * long型的源字段(秒值),转成datetime型的目标字段
     */
    public static Timestamp secondToTimestamp(JSONObject fields, String fieldName) {
        if (!fields.containsKey(fieldName)) {
            return null;
        }
        Long ts = fields.getLong(fieldName);
        return new Timestamp(ts * 1000);
    }

    /**
     * 比较两个字段的值是否相等(如果都是null,则认为相等)
     */
    public static boolean fieldEquals(Object field1, Object field2) {
        if (field1 == null && field2 == null) {
            return true;
        }
        if (field1 == null) {
            return false;
        }
        if (field2 == null) {
            return false;
        }
        return field1.equals(field2);
    }
}
